﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Aga.GestionDeArchivos.Services;
using Aga.GestionDeArchivos.Web.Models.Guarda;
using Aga.GestionDeArchivos.Web.Helpers;
using AutoMapper;
using Aga.GestionDeArchivos.Domain.Entities;
using Aga.GestionDeArchivos.Common;
using System.Globalization;

namespace Aga.GestionDeArchivos.Web.Controllers
{
    public class GuardaController : ControllerBase
    {
        public GuardaController()
        {
            ViewBag.Menu = MenuKey.Guarda;
        }

        public ActionResult Index()
        {
            return RedirectToAction("Index", "Home");
        }

        [CustomAuthorize(Actions = Aga.GestionDeArchivos.Services.Actions.IngresoDeCaja)]
        public ActionResult Ingreso(string ubicacion, string caja, string lastStatus, string mensaje)
        {
            IngresoModel model = new IngresoModel
            {
                Ubicacion = ubicacion,
                Caja = caja,
                LastStatus = lastStatus,
                Message = mensaje
            };

            return View(model);
        }

        [HttpPost]
        [CustomAuthorize(Actions = Aga.GestionDeArchivos.Services.Actions.IngresoDeCaja)]
        public ActionResult Ingreso(IngresoModel model)
        {
            if (!ModelState.IsValid)
            {
                return View(model);
            }

            Movimiento movimiento = null;

            GuardaService service = new GuardaService();

            try
            {
                movimiento = service.IngresarCaja(model.Caja, model.Ubicacion);
            }
            catch (Exception ex)
            {
                return RedirectToAction("Ingreso", new
                {
                    ubicacion = model.Ubicacion,
                    caja = model.Caja,
                    lastStatus = "ERROR",
                    mensaje = ex.Message
                });
            }

            return RedirectToAction("Ingreso", new
            {
                lastStatus = "OK",
                mensaje = String.Format("Se ingresó correctamente la caja {0} en la ubicación {1}.", model.Caja, movimiento.UbicacionDestinoNumero)
            });
        }

        [CustomAuthorize(Actions = Aga.GestionDeArchivos.Services.Actions.EgresoDeCaja)]
        public ActionResult Egreso(string ubicacion, string caja, string motivo, string solicitante, string observaciones, string lastStatus, string mensaje)
        {
            EgresoModel model = new EgresoModel
            {
                Ubicacion = ubicacion,
                Caja = caja,
                Motivo = motivo,
                Solicitante = solicitante,
                Observaciones = observaciones,
                LastStatus = lastStatus,
                Message = mensaje
            };

            return View(model);
        }

        [HttpPost]
        [CustomAuthorize(Actions = Aga.GestionDeArchivos.Services.Actions.EgresoDeCaja)]
        public ActionResult Egreso(EgresoModel model)
        {
            if (!ModelState.IsValid)
            {
                return View(model);
            }

            Movimiento movimiento = null;

            GuardaService service = new GuardaService();

            try
            {
                movimiento = service.EgresarCaja(model.Caja, model.Ubicacion, model.Motivo, model.Solicitante, model.Observaciones);
            }
            catch (Exception ex)
            {
                return RedirectToAction("Egreso", new
                {
                    ubicacion = model.Ubicacion,
                    caja = model.Caja,
                    motivo = model.Motivo,
                    solicitante = model.Solicitante,
                    observaciones = model.Observaciones,
                    lastStatus = "ERROR",
                    mensaje = ex.Message
                });
            }

            return RedirectToAction("Egreso", new
            {
                ubicacion = new Nullable<int>(),
                caja = new Nullable<int>(),
                lastStatus = "OK",
                mensaje = String.Format("Se egresó correctamente la caja {0} de la ubicación {1}.", model.Caja, movimiento.UbicacionOrigenNumero)
            });
        }

        [CustomAuthorize(Actions = Aga.GestionDeArchivos.Services.Actions.TrasladoDeCaja)]
        public ActionResult Traslado(string origen, string destino, string caja, string motivo, string solicitante, string observaciones, string lastStatus, string mensaje)
        {
            TrasladoModel model = new TrasladoModel
            {
                UbicacionOrigen = origen,
                UbicacionDestino = destino,
                Caja = caja,
                Motivo = motivo,
                Solicitante = solicitante,
                Observaciones = observaciones,
                LastStatus = lastStatus,
                Message = mensaje
            };

            return View(model);
        }

        [HttpPost]
        [CustomAuthorize(Actions = Aga.GestionDeArchivos.Services.Actions.TrasladoDeCaja)]
        public ActionResult Traslado(TrasladoModel model)
        {
            if (!ModelState.IsValid)
            {
                return View(model);
            }

            Movimiento movimiento = null;

            GuardaService service = new GuardaService();

            try
            {
                movimiento = service.MoverCaja(model.Caja, model.UbicacionOrigen, model.UbicacionDestino, model.Motivo, model.Solicitante, model.Observaciones);
            }
            catch (Exception ex)
            {
                return RedirectToAction("Traslado", new
                {
                    origen = model.UbicacionOrigen,
                    destino = model.UbicacionDestino,
                    caja = model.Caja,
                    motivo = model.Motivo,
                    solicitante = model.Solicitante,
                    observaciones = model.Observaciones,
                    lastStatus = "ERROR",
                    mensaje = ex.Message
                });
            }

            return RedirectToAction("Traslado", new
            {
                origen = new Nullable<int>(),
                destino = new Nullable<int>(),
                caja = new Nullable<int>(),
                lastStatus = "OK",
                mensaje = String.Format("Se movió correctamente la caja {0} de la ubicación {1} a la ubicacion {2}.", model.Caja, movimiento.UbicacionOrigenNumero, movimiento.UbicacionDestinoNumero)
            });
        }

        [CustomAuthorize(Actions = Aga.GestionDeArchivos.Services.Actions.BuscarCaja)]
        public ActionResult BuscarCaja(string ubicacion, string caja, string lastStatus, string mensaje)
        {
            BuscarModel model = new BuscarModel
            {
                CodigoUbicacion = ubicacion,
                CodigoCaja = caja,
                LastStatus = lastStatus,
                Message = mensaje
            };

            return View(model);
        }

        [HttpPost]
        [CustomAuthorize(Actions = Aga.GestionDeArchivos.Services.Actions.BuscarCaja)]
        public ActionResult BuscarCaja(BuscarModel model)
        {
            if (!ModelState.IsValid)
            {
                return View(model);
            }

            GuardaService service = new GuardaService();

            try
            {
                CajaCliente caja = null;

                if (!String.IsNullOrEmpty(model.CodigoCaja))
                    caja = service.BuscarCajaByCodigo(model.CodigoCaja);
                else if (!String.IsNullOrEmpty(model.CodigoUbicacion))
                    caja = service.BuscarCajaByUbicacion(model.CodigoUbicacion);

                if (caja != null)
                {
                    model.Caja = caja;
                    model.Movimientos = service.ObtenerMovimientos(caja.CodigoBarra);
                }
            }
            catch (Exception ex)
            {
                model.LastStatus = "ERROR";
                model.Message = ex.Message;
            }

            return View(model);
        }

        [CustomAuthorize(Actions = Aga.GestionDeArchivos.Services.Actions.SalidaCajaCerrada)]
        public ActionResult SalidaCaja()
        {
            SalidaCajaModel model = new SalidaCajaModel()
            {
                Focus = "Nombre",
                Detalle = "CAJA AGA CON DOCUMENTACION COMPLETA"
            };

            Session["ItemsRemito"] = new List<ItemRemitoModel>();

            return View(model);
        }

        [HttpPost]
        [CustomAuthorize(Actions = Aga.GestionDeArchivos.Services.Actions.SalidaCajaCerrada)]
        public ActionResult SalidaCaja(SalidaCajaModel model)
        {
            try
            {
                if (model.SubmitAction == "Add")
                {                    
                    List<ItemRemitoModel> items = (List<ItemRemitoModel>)Session["ItemsRemito"];

                    if (!String.IsNullOrWhiteSpace(model.Caja))
                    {

                        GuardaService service = new GuardaService();
                        var caja = service.BuscarCajaByCodigo(model.Caja);
                        if (caja == null)
                            throw new Exception("No se encontró la caja " + model.Caja);

                        if (caja.Cliente.Id.Equals(model.ClienteId))
                        {
                            if (caja.Estado == EstadoCaja.EnGuarda.ToString())
                            {
                                if (!items.Any(i => i.Caja.Equals(model.Caja)))
                                {
                                    items.Add(new ItemRemitoModel
                                    {
                                        Cantidad = 1,
                                        Caja = model.Caja,
                                        Detalle = "CAJA AGA CON DOCUMENTACION COMPLETA"
                                    });

                                    Session["ItemsRemito"] = items;

                                    model.Caja = string.Empty;
                                    model.Detalle = "CAJA AGA CON DOCUMENTACION COMPLETA";

                                    //if (items.Count == 18)
                                    //    model.Focus = "Observaciones";
                                    //else
                                    model.Focus = "Caja";
                                }
                                model.Items = items;
                            }
                            else
                            {
                                model.LastStatus = "ERROR";
                                model.Message = "La caja no se encuentra en guarda.";
                                model.Items = items;
                                model.Focus = "Caja";
                                ModelState.AddModelError("Caja", "");
                            }
                        }
                        else
                        {
                            model.LastStatus = "ERROR";
                            model.Message = "La caja no pertenece al cliente seleccionado.";
                            model.Items = items;
                            model.Focus = "Caja";
                            ModelState.AddModelError("Caja", "");
                        }
                    }
                    else
                    {
                        model.LastStatus = "ERROR";
                        model.Message = "Debe ingresar un código de Caja.";
                        model.Items = items;
                        model.Focus = "Caja";
                        ModelState.AddModelError("Caja", "");
                    }

                    return View(model);
                }
                else if (model.SubmitAction == "Remove")
                {
                    List<ItemRemitoModel> items = (List<ItemRemitoModel>)Session["ItemsRemito"];

                    items.RemoveAll(i => i.Caja.Equals(model.RemoveItemId));

                    Session["ItemsRemito"] = items;

                    model.Items = items;
                    model.Focus = "Caja";

                    return View(model);
                }
            }
            catch (Exception ex)
            {
                List<ItemRemitoModel> items = (List<ItemRemitoModel>)Session["ItemsRemito"];

                model.LastStatus = "ERROR";
                model.Message = ex.Message;
                model.Items = items;
                model.Focus = "Caja";

                return View(model);
            }


            if (!ModelState.IsValid)
            {
                return View(model);
            }
            DateTime fecha;
            if (!DateTime.TryParse(model.Fecha, new CultureInfo("es-AR"), DateTimeStyles.AssumeLocal, out fecha))
            {
                List<ItemRemitoModel> items = (List<ItemRemitoModel>)Session["ItemsRemito"];

                model.LastStatus = "ERROR";
                model.Message = "La fecha ingresada es inválida. Formato: dd/mm/aaaa.";
                model.Items = items;
                model.Focus = "Fecha";

                return View(model);
            }

            try
            {
                List<ItemRemitoModel> itemsRemito = (List<ItemRemitoModel>)Session["ItemsRemito"];

                if (itemsRemito.Count == 0)
                {
                    Session["ItemsRemito"] = itemsRemito;

                    model.LastStatus = "ERROR";
                    model.Message = "No se han agregado items.";
                    model.Items = itemsRemito;
                    model.Focus = "Caja";

                    return View(model);
                }

                GuardaService service = new GuardaService();


                var items = itemsRemito.Select(i => new NuevoItemRemito
                {
                    Caja = i.Caja,
                    Cantidad = i.Cantidad,
                    Detalle = i.Detalle ?? String.Empty
                });

                Remito remito = service.SalidaDeCaja(fecha, model.ClienteId, model.Responsable, model.DomicilioEntrega, model.Observaciones, items);

                return RedirectToAction("SalidaCajaCompletada", new { id = remito.Id });
            }
            catch (Exception ex)
            {
                List<ItemRemitoModel> items = (List<ItemRemitoModel>)Session["ItemsRemito"];

                model.Items = items;

                model.LastStatus = "ERROR";
                model.Message = ex.Message;

                return View(model);
            }
        }

        [HttpPost]
        [CustomAuthorize(Actions = Aga.GestionDeArchivos.Services.Actions.SalidaCajaCerrada)]
        public JsonResult ObtenerDatosCliente(string caja)
        {
            GuardaService service = new GuardaService();

            CajaCliente cajaCliente = service.BuscarCajaByCodigo(caja);

            if (cajaCliente != null)
            {
                return Json(new
                {
                    clienteId = cajaCliente.Cliente.Id,
                    nombre = cajaCliente.Cliente.Nombre,
                    domicilioEntrega = cajaCliente.Cliente.FormattedAddress(),
                    responsable = cajaCliente.Cliente.Responsable
                });
            }
            else
            {
                return Json(new
                {
                    clienteId = 0,
                    nombre = "CAJA NO ENCONTRADA",
                    domicilioEntrega = "",
                    responsable = ""
                });
            }

        }

        [CustomAuthorize(Actions = Aga.GestionDeArchivos.Services.Actions.SalidaDocumentacion)]
        public JsonResult BuscarCliente(string nombre)
        {
            ClienteService service = new ClienteService();

            var cliente = service.Search(nombre);

            if (cliente != null)
            {
                var cli = new
                {
                    Id = cliente.Id,
                    Nombre = cliente.Nombre,
                    Responsable = cliente.Responsable,
                    Domicilio = cliente.FormattedAddress()
                };

                return Json(cli);
            }
            else
            {
                return Json(new
                {
                    Id = 0,
                    Nombre = "",
                    Domicilio = "CLIENTE NO ENCONTRADO",
                    Responsable = ""
                });
            }
        }

        [HttpGet]
        [CustomAuthorize(Actions = Aga.GestionDeArchivos.Services.Actions.SalidaCajaCerrada)]
        public ActionResult ImprimirRemito(int id)
        {
            try
            {
                GuardaService service = new GuardaService();

                Remito remito = service.ObtenerRemito(id);

                ImprimirRemitoModel model = new ImprimirRemitoModel
                {
                    Remito = remito,
                    LastStatus = "OK",
                    Message = string.Empty,
                    PageIndex = 0,
                    PageSize = 18,
                    PageCount = Convert.ToInt32(Math.Ceiling((decimal)remito.Items.Count / 18))
                };

                return View(model);
            }
            catch (Exception ex)
            {
                ImprimirRemitoModel model = new ImprimirRemitoModel
                {
                    Remito = null,
                    LastStatus = "ERROR",
                    Message = ex.Message
                };

                return View(model);
            }
        }

        [CustomAuthorize(Actions = Aga.GestionDeArchivos.Services.Actions.RetornoCajaCerrada)]
        public ActionResult RetornoCaja(string lastStatus, string mensaje)
        {
            RetornoCajaModel model = new RetornoCajaModel()
            {
                Caja = string.Empty
            };

            model.LastStatus = lastStatus;
            model.Message = mensaje;

            return View(model);
        }

        [HttpPost]
        [CustomAuthorize(Actions = Aga.GestionDeArchivos.Services.Actions.RetornoCajaCerrada)]
        public ActionResult RetornoCaja(RetornoCajaModel model)
        {
            if (!ModelState.IsValid)
            {
                return View(model);
            }
            try
            {
                GuardaService service = new GuardaService();

                service.RetornoDeCaja(model.Caja, model.Observaciones);

                return RedirectToAction("RetornoCaja", new { lastStatus = "OK", mensaje = "Se ha completado correctamente el retorno de la caja " + model.Caja });
            }
            catch (Exception ex)
            {
                model.LastStatus = "ERROR";
                model.Message = ex.Message;

                return View(model);
            }
        }

        [HttpGet]
        [CustomAuthorize(Actions = Aga.GestionDeArchivos.Services.Actions.RetornoDocumentacion)]
        public ActionResult RetornoDocumentacion(int? id, int? index)
        {
            RetornoDocumentacionModel model = new RetornoDocumentacionModel();

            if (id.HasValue)
            {
                try
                {
                    model.ClienteId = id.Value;

                    GuardaService service = new GuardaService();

                    var retorno = service.ObtenerDocumentacionSinRetornar(model.ClienteId, index ?? 0, PageSize);

                    Mapper.CreateMap<ItemRemito, ItemRemitoModel>();

                    model.Nombre = retorno.NombreCliente;
                    model.Items = retorno.Items;

                    return View(model);
                }
                catch (Exception ex)
                {
                    model.LastStatus = "ERROR";
                    model.Message = ex.Message;

                    return View(model);
                }
            }
            else
            {
                return View(model);
            }
        }

        [HttpPost]
        [CustomAuthorize(Actions = Aga.GestionDeArchivos.Services.Actions.RetornoDocumentacion)]
        public ActionResult RetornoDocumentacion(RetornoDocumentacionModel model)
        {
            if (!ModelState.IsValid)
            {
                return View(model);
            }
            try
            {
                return RedirectToAction("RetornoDocumentacion", new { id = model.ClienteId });
            }
            catch (Exception ex)
            {
                model.LastStatus = "ERROR";
                model.Message = ex.Message;

                return View(model);
            }
        }

        [HttpPost]
        [CustomAuthorize(Actions = Aga.GestionDeArchivos.Services.Actions.RetornoDocumentacion)]
        public JsonResult RetornarItemDocumentacion(int id, string observaciones)
        {
            GuardaService service = new GuardaService();

            string status;
            string msg;

            try
            {
                service.RetornoDeDocumentacion(id, observaciones);

                status = "ok";
                msg = String.Format("Ha retornado correctamente el item.");
            }
            catch (Exception ex)
            {
                status = "ok";
                msg = ex.Message;
            }

            return Json(new { status = status, message = msg });
        }

        [HttpGet]
        [CustomAuthorize(Actions = Aga.GestionDeArchivos.Services.Actions.VerRemitos)]
        public ActionResult Remitos(int? index, string buscar)
        {
            GuardaService service = new GuardaService();

            IQueryable<Remito> remitos;

            if (!String.IsNullOrWhiteSpace(buscar))
                remitos = service.ObtenerRemitos(buscar);
            else
                remitos = service.ObtenerRemitos();

            RemitosModel model = new RemitosModel
            {
                Remitos = service.GetPage(remitos, index ?? 0, PageSize),
                Buscar = buscar
            };

            return View(model);
        }

        [HttpPost]
        public ActionResult Remitos(RemitosModel model)
        {
            return RedirectToAction("Remitos", new { index = 0, buscar = model.Buscar });
        }

        [HttpGet]
        [CustomAuthorize(Actions = Aga.GestionDeArchivos.Services.Actions.VerRemitos)]
        public ActionResult VerRemito(int id)
        {
            try
            {
                GuardaService service = new GuardaService();

                Remito remito = service.ObtenerRemito(id);

                VerRemitoModel model = new VerRemitoModel
                {
                    Remito = remito
                };

                return View(model);
            }
            catch (Exception ex)
            {
                return ShowError(ex);
            }
        }

        [CustomAuthorize(Actions = Aga.GestionDeArchivos.Services.Actions.SalidaDocumentacion)]
        public ActionResult SalidaDocumentacion()
        {
            SalidaDocumentacionModel model = new SalidaDocumentacionModel()
            {
                Focus = "Nombre"
            };
            
            Session["ItemsRemito"] = new List<ItemRemitoModel>();

            return View(model);
        }

        [HttpPost]
        [CustomAuthorize(Actions = Aga.GestionDeArchivos.Services.Actions.SalidaDocumentacion)]
        public ActionResult SalidaDocumentacion(SalidaDocumentacionModel model)
        {
            DateTime fecha;
            try
            {
                if (model.SubmitAction == "Add")
                {
                    List<ItemRemitoModel> items = (List<ItemRemitoModel>)Session["ItemsRemito"];

                    if (!String.IsNullOrWhiteSpace(model.Caja))
                    {
                        if (!String.IsNullOrWhiteSpace(model.Detalle))
                        {
                            GuardaService service = new GuardaService();
                            if (service.EsCajaDelCliente(model.Caja, model.ClienteId))
                            {
                                if (!items.Any(i => i.Caja.Equals(model.Caja) && i.Detalle.Equals(model.Detalle)))
                                {
                                    items.Add(new ItemRemitoModel
                                    {
                                        Cantidad = 1,
                                        Caja = model.Caja,
                                        Detalle = model.Detalle
                                    });

                                    Session["ItemsRemito"] = items;

                                    model.Caja = string.Empty;
                                    model.Detalle = string.Empty;
                                    model.Focus = "Caja";
                                }
                                model.Items = items;
                            }
                            else
                            {
                                model.Items = items;
                                model.Focus = "Caja";
                                ModelState.AddModelError("Caja", "");
                            }
                        }
                        else
                        {
                            model.Items = items;
                            model.Focus = "Detalle";
                            ModelState.AddModelError("Detalle", "");
                        }
                    }
                    else
                    {
                        model.Items = items;
                        model.Focus = "Caja";
                        ModelState.AddModelError("Caja", "");
                    }

                    return View(model);
                }
                else if (model.SubmitAction == "Remove")
                {
                    List<ItemRemitoModel> items = (List<ItemRemitoModel>)Session["ItemsRemito"];

                    string[] values = model.RemoveItemId.Split(new char[] { ':' });

                    items.RemoveAll(i => i.Caja.Equals(values[0]) && i.Detalle.Equals(values[1]));

                    Session["ItemsRemito"] = items;

                    model.Items = items;
                    model.Focus = "Caja";

                    return View(model);
                }
            }
            catch (Exception ex)
            {
                List<ItemRemitoModel> items = (List<ItemRemitoModel>)Session["ItemsRemito"];

                items.RemoveAll(i => i.Caja.Equals(model.RemoveItemId));

                Session["ItemsRemito"] = items;

                model.LastStatus = "ERROR";
                model.Message = ex.Message;
                model.Items = items;
                model.Focus = "Caja";

                return View(model);
            }

            if (!ModelState.IsValid)
            {
                return View(model);
            }

            if (!DateTime.TryParse(model.Fecha, new CultureInfo("es-AR"), DateTimeStyles.AssumeLocal, out fecha))
            {
                List<ItemRemitoModel> items = (List<ItemRemitoModel>)Session["ItemsRemito"];

                model.LastStatus = "ERROR";
                model.Message = "La fecha ingresada es inválida. Formato: dd/mm/aaaa.";
                model.Items = items;
                model.Focus = "Fecha";

                return View(model);
            }

            try
            {
                List<ItemRemitoModel> itemsRemito = (List<ItemRemitoModel>)Session["ItemsRemito"];

                if (itemsRemito.Count == 0)
                {
                    Session["ItemsRemito"] = itemsRemito;

                    model.LastStatus = "ERROR";
                    model.Message = "No se han agregado items.";
                    model.Items = itemsRemito;
                    model.Focus = "Caja";

                    return View(model);
                }

                GuardaService service = new GuardaService();

                var items = itemsRemito.Select(i => new NuevoItemRemito
                {
                    Caja = i.Caja,
                    Cantidad = i.Cantidad,
                    Detalle = i.Detalle
                });

                Remito remito = service.SalidaDeDocumentacion(fecha, model.ClienteId, model.Responsable, model.DomicilioEntrega, model.Observaciones, items);

                return RedirectToAction("SalidaDocumentacionCompletada", new { id = remito.Id });

            }
            catch (Exception ex)
            {
                List<ItemRemitoModel> items = (List<ItemRemitoModel>)Session["ItemsRemito"];

                model.Items = items;
                model.LastStatus = "ERROR";
                model.Message = ex.Message;

                return View(model);
            }
        }

        [CustomAuthorize(Actions = Aga.GestionDeArchivos.Services.Actions.CreateRemito)]
        public ActionResult NuevoRemito()
        {
            ItemsService service = new ItemsService();

            NuevoRemitoModel model = new NuevoRemitoModel()
            {
                Focus = "Nombre",
                AllItems = service.GetAll().ToList()
                                  .Select(i => new SelectListItem
                                  {
                                      Text = i.Detalle,
                                      Value = i.Id.ToString()
                                  }).ToList()
            };

            Session["ItemsRemito"] = new List<ItemNuevoRemitoModel>();

            return View(model);
        }

        [HttpPost]
        [CustomAuthorize(Actions = Aga.GestionDeArchivos.Services.Actions.CreateRemito)]
        public ActionResult NuevoRemito(NuevoRemitoModel model)
        {
            DateTime fecha;
            ItemsService service = new ItemsService();
            try
            {
                if (model.SubmitAction == "Add")
                {
                    List<ItemNuevoRemitoModel> items = (List<ItemNuevoRemitoModel>)Session["ItemsRemito"];

                    if (model.NuevoItemId > 0)
                    {
                        model.AllItems = service.GetAll().ToList()
                                                          .Select(i => new SelectListItem
                                                          {
                                                              Text = i.Detalle,
                                                              Value = i.Id.ToString()
                                                          }).ToList();

                        var item = service.GetById(model.NuevoItemId);

                        if (item == null)
                        {
                            model.Items = items;
                            model.Focus = "NuevoItemId";
                            ModelState.AddModelError("NuevoItemId", "");
                        }
                        else if (model.NuevoItemCantidad <= 0)
                        {
                            model.Items = items;
                            model.Focus = "NuevoItemCantidad";
                            ModelState.AddModelError("NuevoItemCantidad", "");

                            return View(model);
                        }
                        else
                        {
                            items.Add(new ItemNuevoRemitoModel
                                {
                                    Cantidad = model.NuevoItemCantidad,
                                    ItemId = item.Id,
                                    ItemDetalle = item.Detalle,
                                    ItemDescripcion = model.NuevoItemDescripcion
                                });

                            Session["ItemsRemito"] = items;

                            model.NuevoItemCantidad = 1;
                            model.NuevoItemId = 0;
                            model.Focus = "NuevoItemCantidad";
                            model.Items = items;
                        }
                    }
                    else
                    {
                        model.Items = items;
                        model.Focus = "NuevoItemId";
                        ModelState.AddModelError("NuevoItemId", "");
                    }

                    return View(model);
                }
                else if (model.SubmitAction == "Remove")
                {
                    model.AllItems = service.GetAll().ToList().Select(i => new SelectListItem
                                                      {
                                                          Text = i.Detalle,
                                                          Value = i.Id.ToString()
                                                      }).ToList();

                    List<ItemNuevoRemitoModel> items = (List<ItemNuevoRemitoModel>)Session["ItemsRemito"];

                    items.RemoveAt(Convert.ToInt32(model.RemoveItemId));

                    Session["ItemsRemito"] = items;

                    model.NuevoItemCantidad = 1;
                    model.NuevoItemId = 0;
                    model.Focus = "NuevoItemCantidad";

                    model.Items = items;

                    return View(model);
                }
            }
            catch (Exception ex)
            {
                List<ItemNuevoRemitoModel> items = (List<ItemNuevoRemitoModel>)Session["ItemsRemito"];

                model.LastStatus = "ERROR";
                model.Message = ex.Message;
                model.Items = items;
                model.Focus = "NuevoItemCantidad";

                return View(model);
            }

            if (!ModelState.IsValid)
            {
                return View(model);
            }

            if (!DateTime.TryParse(model.Fecha, new CultureInfo("es-AR"), DateTimeStyles.AssumeLocal, out fecha))
            {
                List<ItemNuevoRemitoModel> items = (List<ItemNuevoRemitoModel>)Session["ItemsRemito"];

                model.LastStatus = "ERROR";
                model.Message = "La fecha ingresada es inválida. Formato: dd/mm/aaaa.";
                model.Items = items;
                model.Focus = "Fecha";

                return View(model);
            }

            try
            {
                List<ItemNuevoRemitoModel> itemsRemito = (List<ItemNuevoRemitoModel>)Session["ItemsRemito"];

                if (itemsRemito.Count == 0)
                {
                    Session["ItemsRemito"] = itemsRemito;

                    model.LastStatus = "ERROR";
                    model.Message = "No se han agregado items.";
                    model.Items = itemsRemito;
                    model.Focus = "Caja";

                    return View(model);
                }

                var items = itemsRemito.Select(i => new NuevoItemRemito
                {
                    Cantidad = i.Cantidad,
                    ItemId = i.ItemId,
                    Detalle = i.ItemDetalle,
                    Descripcion = i.ItemDescripcion
                });

                GuardaService guarda = new GuardaService();

                Remito remito = guarda.NuevoRemito(fecha, model.ClienteId, model.Responsable, model.DomicilioEntrega, model.Observaciones, items);

                return RedirectToAction("NuevoRemitoCompletado", new { id = remito.Id });

            }
            catch (Exception ex)
            {
                List<ItemNuevoRemitoModel> items = (List<ItemNuevoRemitoModel>)Session["ItemsRemito"];

                model.Items = items;

                model.LastStatus = "ERROR";
                model.Message = ex.Message;

                return View(model);
            }
        }

        [CustomAuthorize(Actions = Aga.GestionDeArchivos.Services.Actions.CreateRemito)]
        public ActionResult NuevoRemitoCompletado(int id)
        {
            ViewData["RemitoId"] = id;

            return View();
        }

        [CustomAuthorize(Actions = Aga.GestionDeArchivos.Services.Actions.SalidaCajaCerrada)]
        public ActionResult SalidaCajaCompletada(int id)
        {
            ViewData["RemitoId"] = id;

            return View();
        }

        [CustomAuthorize(Actions = Aga.GestionDeArchivos.Services.Actions.SalidaDocumentacion)]
        public ActionResult SalidaDocumentacionCompletada(int id)
        {
            ViewData["RemitoId"] = id;

            return View();
        }

    }
}
